<?php

/**
 * 改上传类用户可以传入
 * 1.$path  上传文件放的目录
 * 2.$allowType  该参数是限制的上传类型 需带上.
 * 3.$size 文件的大小
 *
 * 用户还可以通过公共变量获取错误信息
 */

class Upload{
	private $UploadDir;
	public $error;
	private $allowType;
	private $size;
	public function __construct($path='upload/',$allowType=array('.jpg','.png','.gif','.bmp'),$size='22000000'){
		$this->UploadDir = $path;
		$this->allowType = $allowType;
		$this->size = $size;
	}
	// 上传方法
	public function uploadMethoad(){
		// 1.重组数组
		$newArr = $this->restArr();

		// //2.筛选
		// foreach ($newArr as $v) {
			// 	// 如果有图片不符合规则跳过该文件 继续执行下边的
			// 	if($this->filter($v)){
			// 		$this->move($v);
			// 	}else{
			// 		continue;
			// 	}
		// }
		foreach ($newArr as $v) {
			// 如果有图片不符合规范则一个都不上传
			if(!$this->filter($v)){
				return false;
			}
		}
		foreach ($newArr as $v) {
		 	// 3.移动上传
			$this->move($v);
		}
	}
	/**
	 * [restArr description] 遍历数组
	 * @return [type] [description]
	 */
	private function restArr(){
		$tmpArr = array();
		// 1.遍历数组
		foreach ($_FILES as $v) {
			if(is_array($v['name'])){
				foreach ($v['name'] as $key => $value) {
					$tmpArr[] = array(
						'name'=>$value,
						'type'=>$v['type'][$key],
						'error'=>$v['error'][$key],
						'tmp_name'=>$v['tmp_name'][$key],
						'size'=>$v['size'][$key],
						);
				}
			}else{
				$tmpArr[] = $v;
			}
		}
		return $tmpArr;
	}
	/**
	 * [filter description] 过滤数组
	 * @param  [type] $v [description]
	 * @return [type]    [description]
	 */
	private function filter($v){
		$type = strrchr($v['name'],'.');
		switch (true) {
			// 1.没有文件被上传
			case $v['error']==4:
				$this->error = '没有文件被上传';
				return false;
				break;
			// 2.必须是合法的上传文件
			case !is_uploaded_file($v['tmp_name']):
				$this->error = '必须是合法的上传文件';
				return false;
				break;
			// 3.类型
			case !in_array($type, $this->allowType):
				$this->error = '类型不允许';
				return false;
				break;
			// 4.大小
			case $v['size'] > $this->size:
				$this->error = '文件超过配置大小';
				return false;
				break;
			//5.四种错误
			case $v['error']==1:
				$this->error = '大小超过了 php.ini 中 upload_max_filesize 限制值';
				return false;
				break;
			case $v['error']==2:
				$this->error = '大小超过 HTML 表单中 MAX_FILE_SIZE 选项指定的值';
				return false;
				break;
			case $v['error']==3:
				$this->error = '文件只有部分被上传';
				return false;
				break;

			default:
				return true;
				break;
		}
	}
	/**
	 * 移动上传
	 */
	private function move($v){
		// 类型
		$type = strrchr($v['name'], '.');
		// 文件名
		$fileName = date('Y-m-d-H-i-s', time()).mt_rand(0,100000).$type;
		// 上传路径
		is_dir($this->UploadDir) || mkdir($this->UploadDir,0777,true);
		// 完整的路径
		$fullPath = $this->UploadDir.'/'.$fileName;
		move_uploaded_file($v['tmp_name'], $fullPath);
	}
}

 ?>
